package org.csu.softwaremetrics_demo.metric.ck;

/**
 * NOC（Number of Children）度量辅助类
 * 用于跟踪和累计类的直接子类数量
 * 特别处理了跨文件的继承关系
 */

import org.csu.softwaremetrics_demo.entity.common.CKMetricSingleClass;
import org.csu.softwaremetrics_demo.entity.result.impl.CKMetricResult;

import java.util.HashMap;
import java.util.Map;

public class NOCExtras {

    // 存储每个类的子类计数
    private final Map<String, Integer> toAdd;

    // 构造函数，初始化toAdd为空HashMap
    public NOCExtras() {
        toAdd = new HashMap<>();
    }

    /**
     * 为指定类增加一个子类计数
     * 如果是Object类则忽略不计
     *
     * @param clazz 要增加子类计数的类名
     */
    public void plusOne(String clazz) {
        // 如果类名是java.lang.Object，则直接返回，不进行计数
        if (clazz.equals("java.lang.Object"))
            return;

        // 如果toAdd中不包含该类名，则初始化计数为0
        if (!toAdd.containsKey(clazz))
            toAdd.put(clazz, 0);

        // 将该类名的计数加1
        toAdd.put(clazz, toAdd.get(clazz) + 1);
    }

    /**
     * 更新CK报告中的NOC度量值
     * 将累计的子类数量更新到对应类的度量结果中
     *
     * @param result CK度量报告对象
     */
    public void update(CKMetricResult result) {
        // 遍历toAdd中的每个类名及其子类计数
        for (Map.Entry<String, Integer> kv : toAdd.entrySet()) {
            // 根据类名从CK度量报告对象中获取对应的类度量结果
            CKMetricSingleClass ck = result.getByClassName(kv.getKey());
            // 如果找到了对应的类度量结果，则将子类计数更新到该类的NOC度量值中
            if (ck != null) ck.incNoc(kv.getValue());
        }
    }
}
